#类方法：可以通过类名调用，也可以通过实例名调用
#1 类方法不能访问实例变量，可以访问类变量
#2 类方法需要加上@classmethod，第一参数必须是class(cls)
class Dog:
    dogs = [] #用来保存所有狗的列表
    @classmethod
    def num_of_dogs(cls):
        return len(cls.dogs)

    #num_of_dogs = 0 #类属性
    #构造方法 添加实例属性，做其他的初始化工作
    def __init__ (self,name,height,power):
        self.name = name
        self.height = height
        self.blood = 10
        self.power = power
        Dog.dogs.append(self.name)
        #Dog.num_of_dogs = Dog.num_of_dogs +1
        print(f'{self.name}出生了，汪汪！')
    def bark(self):
        print(f'我是{self.name}，身高{self.height}，血量{self.blood}，攻击力{self.power}')
    def attack(self,dog2):
        dog2.reduce_blood(self.power)
    def reduce_blood(self,reduce_value):
        if(reduce_value > self.blood):
            self.blood = 0
        else:
            self.blood = self.blood - reduce_value

d1 = Dog('大黄',0.7,3) #创建第一个实例
d2 = Dog('二黑',0.5,4) #创建第二个实例
# d1.num_of_dogs = 10 #给d1创建了一个实例属性，当实例属性和类属性相同时，通过实例访问，优先访问实例属性。
# Dog.num_of_dogs = 8
d1.reduce_blood(4)
d1.bark()

# print(Dog.num_of_dogs())#通过类名访问
# print(d1.num_of_dogs())#通过实例访问
# print(d2.num_of_dogs())#通过实例访问
print(d1.dogs)